<?php
/**
* Библиотека - хелпер
* 
* Производит работу с данными блока
* 
* @autor Polikarpov Alexander polikarpovalexander@mail.ru
* @version 1.0
*/
class block_pguestbook_manager {

    /**
    * Получение данных 
    * 
    * @param string $param Задача, для которой готовим данные
    * @return bool|object
    */
    private function validator($param) 
    {
        global $OUTPUT, $USER;
        // В зависимости от параметра 
        // готовим данные
        switch ($param) 
        {
            // Если добавляем в БД
            case 'add' :
                $res = new stdClass;
                $res->postid = optional_param('pguestbook_id', 0, PARAM_INT);
                $res->autor = optional_param('pguestbook_autor', NULL, PARAM_TEXT);
                $res->userid = $USER->id;
                $res->time = date('U');
                $res->text = optional_param('pguestbook_text', NULL, PARAM_TEXT);
                /*     Функция optional_param очищает код от мусора, 
                    невозможно сохранить строку типа <!--   -->
                
                $res->autor = htmlspecialchars($res->autor);
                $res->text = htmlspecialchars($res->text);
                $res->autor = strip_tags($res->autor);
                $res->text = strip_tags($res->text);
                $res->autor = mysql_escape_string($res->autor);
                $res->text = mysql_escape_string($res->text);*/
                // Проверяем на достаточность
                if ($res->autor == '' || $res->text == '')
                    return false; 
                return $res;
                break;
            // Если удаляем из БД
            case 'delete' : 
                $res = new stdClass;
                $res->id = optional_param('pguestbook_id', 0, PARAM_INT);
                return $res;
                break;
            // Если редактируем запись в БД
            case 'update' : 
                $res = new stdClass;
                $res->id = optional_param('pguestbook_id', 0, PARAM_INT);
                $res->text = optional_param('pguestbook_text', 'text', PARAM_TEXT);
                /*    Аналогично
                
                $res->text = htmlspecialchars($res->text);
                $res->text = strip_tags($res->text);
                $res->text = mysql_escape_string($res->text);*/
                // Проверяем на достаточность
                if ($res->text == '')
                    return false; 
                return $res;
            default: 
                break;
        }
    }
    /**
    * Добавление в БД
    * 
    * @return void
    */
    public function add() 
    {
        global $DB;
        // Готовим данные
        $insert = $this->validator('add');
        // Если вернул данные, отправляем запрос
        if ($insert) {
        // Если поле postid > 0,
        // то добавляем комментарий
        if ($insert->postid) {
            $DB->insert_record('block_pguestbook_comments', $insert); 
        // иначе добавляем сообщение
        } else {
            unset($insert->postid);
            $DB->insert_record('block_pguestbook_posts', $insert); 
        }
        }
    }
    /**
    * Изменение сообщения
    * 
    * @return void
    */
    public function changepost() 
    {
        global $DB;
        // Готовим данные
        $update = $this->validator('update');
        // Если вернул данные, отправляем запрос
        if ($update) 
        $DB->update_record('block_pguestbook_posts', $update); 
    }
    /**
    * Изменение комментария
    * 
    * @return void
    */
    public function changecomment() 
    {
        global $DB;
        // Готовим данные
        $update = $this->validator('update');
        // Если вернул данные, отправляем запрос
        if ($update) 
        $DB->update_record('block_pguestbook_comments', $update); 
    }
    /**
    * Удаление сообщения
    * 
    * @return void
    */
    public function deletepost()
    {
        global $DB;
        // Готовим данные
        $delete = $this->validator('delete');
        $DB->delete_records(
            'block_pguestbook_posts', array('id' => $delete->id)); 
        $DB->delete_records(
            'block_pguestbook_comments', array('postid'=>$delete->id)); 
    }
    /**
    * Удаление комментария
    * 
    * @return void
    */
    public function deletecomment() 
    {
        global $DB;
        // Готовим данные
        $delete = $this->validator('delete');
        $DB->delete_records(
            'block_pguestbook_comments', array('id'=>$delete->id));
    }
    /**
    * Вывод гостевой книги
    * 
    * @return array
    */
    public function getall() 
    {
        global $DB;
        $result = array();
        
        // Этот запрос корректно работает как чистый sql запрос,
        // но функция выдает неверный результат.
        /*$result = $DB->get_records_sql('
                     SELECT  p.id, p.autor, p.time, p.text,
                             c.id, c.autor, c.time, c.text 
                       FROM  {block_pguestbook_posts} p
            LEFT OUTER JOIN  {block_pguestbook_comments} c ON p.id = c.postid
                   ORDER BY  p.time DESC, c.time DESC;
        ');*/
        
        // Получаем данные
        $posts = $DB->get_records(
                            'block_pguestbook_posts',
                            null,
                            'time DESC',
                            'id, autor, userid, time, text'
                        );
        $comments = $DB->get_records(
                            'block_pguestbook_comments',
                            null,
                            'time DESC',
                            'id, postid, userid, autor, time, text'
                        );
                        
        // Создаем массив данных для гостевой книги                
        foreach ($posts as $pline) 
        {
            $flag = false;
            foreach ($comments as $cline) 
            {
                if ($pline->id == $cline->postid) 
                {
                    $flag = true;
                    array_push(
                        $result, 
                        array(
                            $pline->id,
                            $pline->autor,
                            gmdate("Y-m-d\ H:i:s\ ", $pline->time),
                            $pline->text,
                            $cline->id,
                            $cline->autor,
                            gmdate("Y-m-d\ H:i:s\ ", $cline->time),
                            $cline->text,
                            $pline->userid,
                            $cline->userid
                        ));
                }
            }
            if(!$flag)
                array_push(
                    $result, 
                    array(
                        $pline->id,
                        $pline->autor,
                        gmdate("Y-m-d\ H:i:s\ ", $pline->time),
                        $pline->text,
                        NULL,
                        NULL,
                        NULL,
                        NULL,
                        $pline->userid, 
                        NULL
                    ));
        }  
        // Возвращаем массив
        return $result;
    }
}